void __init __start_xen(multiboot_info_t *mbi)
{
- char *cmdline;
+ char __cmdline[] = "", *cmdline = __cmdline;
struct domain *idle_domain;
unsigned long _initrd_start = 0, _initrd_len = 0;
unsigned int initrdidx = 1;
/* Parse the command-line options. */
if ( (mbi->flags & MBI_CMDLINE) && (mbi->cmdline != 0) )
- cmdline_parse(__va(mbi->cmdline));
+ cmdline = __va(mbi->cmdline);
+ cmdline_parse(cmdline);
set_current((struct vcpu *)0xfffff000); /* debug sanity */
set_processor_id(0); /* needed early, for smp_processor_id() */
init_console();
+ printf("Command line: %s\n", cmdline);
+
/* Check that we have at least one Multiboot module. */
if ( !(mbi->flags & MBI_MODULES) || (mbi->mods_count == 0) )
{
/* Grab the next whitespace-delimited option. */
q = opt;
while ( (*p != ' ') && (*p != '\0') )
- *q++ = *p++;
+ {
+ if ( (q-opt) < (sizeof(opt)-1) ) /* avoid overflow */
+ *q++ = *p;
+ p++;
+ }
*q = '\0';
/* Search for value part of a key=value option. */
optval = strchr(opt, '=');
if ( optval != NULL )
- *optval++ = '\0';
+ *optval++ = '\0'; /* nul-terminate the option value */
+ else
+ optval = q; /* default option value is empty string */
for ( param = &__setup_start; param <= &__setup_end; param++ )
{
switch ( param->type )
{
case OPT_STR:
- if ( optval != NULL )
- {
- strncpy(param->var, optval, param->len);
- ((char *)param->var)[param->len-1] = '\0';
- }
+ strncpy(param->var, optval, param->len);
+ ((char *)param->var)[param->len-1] = '\0';
break;
case OPT_UINT:
- if ( optval != NULL )
- *(unsigned int *)param->var =
- simple_strtol(optval, (char **)&optval, 0);
+ *(unsigned int *)param->var =
+ simple_strtol(optval, (char **)&optval, 0);
break;
case OPT_BOOL:
*(int *)param->var = 1;
break;
case OPT_CUSTOM:
- if ( optval != NULL )
- ((void (*)(char *))param->var)(optval);
+ ((void (*)(char *))param->var)(optval);
break;
}
}